Proměnné a náhodné hodnoty

python.edumach.cz

Náhodná čísla a příkazový režim

Pro práci s náhodnými čísly potřebujeme použít modul random. Importujeme jej stejně jako modul tkinter, tedy na začátku programu. Nyní můžeme použít příkazy random.randint(), random.randrange() a další.

import tkinter
import random

canvas = tkinter.Canvas()
canvas.pack()

canvas.create_text(100, 100, text=random.randint(10, 20))
canvas.create_text(150, 100, text=random.randint(5, 8))

Tento program vypíše dvě náhodná celá čísla. Jedno bude na souřadnici [100, 100] a bude z intervalu <10, 20>, druhé bude na souřadnici [150, 100] a bude z intervalu <5, 8>.

❓Otázky

  1. Jaká čísla bude program zapisovat na souřadnici [150, 100]?

  2. Zjistěte, která čísla program vypíše na souřadnici [150, 100] nahrazením random.randint(5,8) za random.randrange(5).

  3. Jaká čísla se vytisknou, pokud použijeme příkaz v příkazu: 
    a. random.randrange(2),
    b. random.randrange(1).

  4. Jaký je rozdíl mezi random.randrange(3,5) a random.randint(3,5)?

Můžeme také psát příkazy přímo v příkazovém režimu (v okně prostředí Pythonu). Stačí napsat příkaz do příkazového řádku a po stisknutí klávesy Enter se zadaný příkaz okamžitě provede. Právě v příkazovém režimu můžeme otestovat, která náhodná čísla bude počítač “losovat”. Pokud jsme nespustili žádný program, ve kterém importujeme modul na náhodná čísla, můžeme modul importovat i přímo z příkazové řádky. Tady je ukázka příkazů, které jsme zadali na příkazovém řádku:

>>> import random 
>>> random.randint(10, 15)11
>>>

Vyzkoušejte si, co tento program nakreslí:

import tkinter
import random

canvas = tkinter.Canvas()
canvas.pack()

canvas.create_line(0, 0, random.randrange(200), 100)

Abychom lépe viděli, kde jsou tyto čáry, které mají náhodné číslo v jedné ze souřadnic, nakresleny, můžeme také zadávat příkazy přímo v shellu (příkazový režim) i do běžícího programu (již existuje okno s grafickou plochou a importovaným modulem random). Jakmile je příkaz potvrzen, uvidíme, co se stane v grafické ploše.

>>> canvas.create_line(0, 0, random.randrange(200), 100)>>> canvas.create_line(0, 0, random.randrange(200), 100)>>> canvas.create_line(0, 0, random.randrange(200), 100)

💾 Úkol

Nakreslete šest náhodných čísel od 1 do 49 vedle sebe v grafické ploše. Myslíte si, že takový program můžeme použít k losování čísel v loterii? Svou odpověď zdůvodněte.

Proměnné a náhodné barvy

Tento program nám nakreslí náhodný obdélník, který má levý horní bod na souřadnici [50, 100].

import tkinter
import random

canvas = tkinter.Canvas()
canvas.pack()

canvas.create_rectangle(50, 100, 50+random.randint(30, 100), 100+random.randint(30, 100))

Jak bychom zajistili, že na souřadnici [50, 100] bude nakreslen náhodný čtverec? Co musí obdélník splňovat, aby byl čtvercem? Musí mít stejnou šířku a výšku. Metoda random.randint() však  nakreslí náhodnou hodnotu pokaždé, když ji použijete. Někdy se nám může stát, že hodnota bude stejná a bude to čtverec, ale často kreslí jiná čísla. Stačí si nakreslit číslo jednou, zapamatovat si ho a pak ho použít na místech, kde ho používáme. Můžeme si zapamatovat data v proměnné. Znáte proměnné z matematiky a používáte je k označení hodnoty, která se může změnit, často jako xx.

V programu vytvoříme proměnnou velikost, nakreslíme náhodné číslo a zapamatujeme si ho v této proměnné a tuto zapamatovanou hodnotu pak použijeme na místech, kde ji potřebujeme.

import tkinter
import random

canvas = tkinter.Canvas()
canvas.pack()

velikost = random.randint(30, 100)
canvas.create_rectangle(50, 100, 50+velikost, 100+velikost)

Můžeme si také zapamatovat souřadnice, na které kreslíme čtverec v proměnné, a pak při kreslení používat pouze proměnné.

x = 50
y = 100
velikost = random.randint(30, 100)
canvas.create_rectangle(x, y, x+velikost, y+velikost)

Pokud k proměnným x a y přičteme tah náhodného čísla, nakreslíme náhodný čtverec na náhodném místě.

x = random.randrange(200)
y = random.randrange(200)
velikost = random.randint(30, 100)
canvas.create_rectangle(x, y, x+velikost, y+velikost)

Pokud jsme již program spustili a do příkazového řádku napíšeme název proměnné a stiskneme Enter, Python nám zapíše aktuální hodnotu proměnné.

>>> x
61
>>> y
186
>>> velikost
42

V příkazové řádce můžeme také nastavit hodnoty proměnných.

>>> velikost = 100
>>> canvas.create_rectangle(x, y, x+velikost, y+velikost)
2
>>>

S proměnnými můžeme provádět matematické operace. Mezi základní patří sčítání (+), odčítání (-), násobení (*) a dělení (/). Python umí mnohem víc operací, ale tyto nám pro začátek stačí.

>>> a = 5
>>> b = 10
>>> c = a + b
>>> c
15
>>> d = c – 2  * a
>>> d
5
>>> d / 2
2.5

A můžeme také provést výpočet se samotnou proměnnou a výsledek si zapamatovat do stejné proměnné, tedy změnit její hodnotu podle výpočtu.

>>> a = 5
>>> a = a + 1
>>> a
6
>>>

V samotném programu (programovém režimu) nestačí napsat pouze název proměnné. Jakmile program spustí, Python nebude vědět, co má s proměnnou dělat. Na rozdíl od příkazového režimu musíme použít příkaz print() k zapsání nějaké hodnoty do okna shellu. Například: print(a) vypíše hodnotu proměnné a. Pomocí příkazu print() můžete také vypsat různé výpočty, např. print(a*3+5), print(6+2*4) nebo dokonce text (podobný create_text) print('Ahoj').

x = random.randrange(200)
y = random.randrange(200)
velikost = random.randint(30, 100)
canvas.create_rectangle(x, y, x+velikost, y+velikost)

print(x, y, velikost)

Pomocí random.choice() můžeme vybrat jeden náhodný prvek ze zadaného seznamu. V ukázce je to seznam ['red', 'yellow', 'blue']. Tento příkaz můžeme použít k nakreslení náhodné barvy z uvedených barev. Obdélník z předchozího příkladu vyplníme nakreslenou barvou. Abychom neměli příliš dlouhé příkazy, uložíme si náhodně zvolenou barvu do proměnné barva. Zde je výsledný program:

import tkinter
import random

canvas = tkinter.Canvas()
canvas.pack()

x = random.randrange(200)
y = random.randrange(200)
velikost = random.randint(30, 100)
barva = random.choice(['red', 'yellow', 'blue'])
canvas.create_rectangle(x, y, x+velikost, y+velikost, fill=barva)

print(x, y, velikost, barva)

Vysvětlení random.choice(['red', 'yellow', 'blue']):

Výsledkem bude vždy právě jedna z těchto tří barev – buď 'red', 'yellow', nebo 'blue'. Ta se uloží do proměnné barva.

💾 Úkoly

Čtverec s velikostí

Upravte program tak, abychom uprostřed ve čtverci viděli i nakreslenou velikost čtverce.

Čára 1

Vytvořte program, který nakreslí náhodnou čáru náhodné tloušťky. Pomocí příkazu print() zapisuje do shellu také informace o tloušťce čáry.

Čára 2

Vytvořte program, který nakreslí vodorovnou čáru o délce 50 bodů na náhodném místě. Pomocí příkazu print() zapisuje do shellu také informace o místě (x1 a x2).

Náhodné kreslení obrázků

Doposud jsme kreslili obrázky na pevném místě plochy. Všechny zadané souřadnice byla konkrétní čísla. Můžeme kreslit jednoduché tvary na náhodném místě. Na náhodném místě můžeme nakreslit i složitější obrázky, pokud se zamyslíme nad relativními souřadnicemi bodů. To znamená, že určíme jeden z bodů jako základní na obrázku a všechny ostatní souřadnice určíme relativně od tohoto referenčního bodu. To, zda je další bod nalevo nebo napravo od tohoto bodu, označuje, zda je souřadnice x menší nebo větší. To znamená, zda něco odečteme od souřadnice referenčního bodu nebo k němu něco přidáme. A tak je to i na souřadnici y.

Do programu můžeme také psát různé poznámky, kterých si Python nevšimne. Takovým textovým komentářům říkáme komentáře. Komentář vždy začíná znakem # a končí na konci řádku.

Někdy, když hledáme chybu, potřebujeme, aby program neprováděl některé řádky. Pak můžeme také použít # na začátku těchto řádků. Pokud je řádků více, vybereme je a v menu vybereme Format \to Comment Out Region, který k řádkům přidá #.

import tkinter
canvas = tkinter.Canvas(width=640, height=320)
canvas.pack()

canvas.create_rectangle(100, 100, 160, 200, fill='skyblue') #telo
canvas.create_rectangle(110, 50, 150, 100, fill='skyblue') #hlava

#oci
canvas.create_rectangle(115, 60, 125, 70, fill='yellow')
canvas.create_rectangle(135, 60, 145, 70, fill='yellow')

#usta
canvas.create_rectangle(115, 80, 145, 90, fill='red')

#nohy
canvas.create_rectangle(100, 200, 120, 280, fill='skyblue')
canvas.create_rectangle(140, 200, 160, 280, fill='skyblue')

#ruce
canvas.create_line(100,110,60,150, width=15)
canvas.create_line(160,110,210,150, width=15)

Tento program nakreslí tohoto robota.

Pokud bychom chtěli nakreslit stejného robota na různých místech, definujeme jeden bod jako základní. Například můžeme určit jako referenční bod levý horní bod těla obdélníku, obecně jej označit jako bod se souřadnicemi [x, y] a všechny ostatní body budou mít souřadnici podle toho, jak daleko jsou od tohoto bodu (relativní vzdálenost). Na obrázku vidíme vyznačený vztažný bod a velikosti jednotlivých částí obrázku.

Obdélník trupu robota lze určit pomocí základního bodu a pravého dolního bodu obdélníku trupu. Tento bod je 60 bodů dolů na ose x (protože obdélník je široký 60 bodů) a na ose y 100 bodů dolů (protože má zadanou výšku 100 bodů). Vzhledem k tomu, že referenční bod má obecnou souřadnici [x, y], pravý dolní roh trupu bude mít souřadnici [x+60, y+100]. Nakreslíme tedy trup příkazem

canvas.create_rectangle(x, y, x+60, y+100)

Můžeme nakreslit obdélník hlavy pomocí levého horního bodu hlavy a pravého dolního bodu hlavy. Levý horní bod hlavy je 10 bodů vpravo na souřadnici x a 50 bodů nahoru od základního bodu na souřadnici y. Je tedy na souřadnici [x+10, y-50]. Pravý dolní bod hlavy je 50 bodů vpravo na ose x a má stejnou souřadnici y jako referenční bod, takže jeho souřadnice jsou [x+50, y] a hlavu nakreslíme příkazem

canvas.create_rectangle(x+10, y-50, x+50, y)

Celý program, který kreslí tohoto robota na relativním místě, lze zapsat takto:

import tkinter
canvas = tkinter.Canvas(width=600, height=600)
canvas.pack()

x = 100
y = 100

#telo
canvas.create_rectangle(x, y, x+60, y+100, fill='skyblue') #telo
canvas.create_rectangle(x+10, y-50, x+50, y, fill='skyblue') #hlava

#oci
canvas.create_rectangle(x+15, y-40, x+25, y-30, fill='yellow')
canvas.create_rectangle(x+35, y-40, x+45, y-30, fill='yellow')

#usta
canvas.create_rectangle(x+15, y-20, x+45, y-10, fill='red')

#nohy
canvas.create_rectangle(x, y+100, x+20, y+180, fill='skyblue')
canvas.create_rectangle(x+40, y+100, x+60, y+180, fill='skyblue')

#ruce
canvas.create_line(x, y+10, x-40, y+50, width=15)
canvas.create_line(x+60, y+10, x+110, y+50, width=15)

Pokud nastavíme hodnotu proměnných x a y na náhodnou hodnotu, robot bude vykreslen na náhodném místě.

💾 Úkoly

Dokončení robota

Dokončete robota tak, aby měl nakreslené uši, anténu na hlavě a na trupu své jméno (například “R.U.R.”)

Sportovní vlajka

Vytvořte nový program, který bude kreslit vlajku sportovního klubu. Vlajka bude tvořena čtyřmi barevnými obdélníky, které se vzájemně dotýkají v jediném bodě jako na obrázku:

Program si náhodně zvolí:

  1. souřadnice levého horního rohu vlajky,
  2. souřadnice, které představují místo dotyku všech čtyř obdélníků.

Vnější rozměry vlajky budou 200×100200 \times 100; barvy na vlajce si urči podle svého uvážení.

Náhodné dopravní značky

Nakreslete tuto značku na náhodné místo na ploše tak, aby byl i rychlostní limit náhodný (30, 40, 50, 60, 80, 110).